package runtime_area

import "jvm/nzpJvm/runtime_area/heap"

// 对应一个线程，线程中有私有的pc寄存器和虚拟机栈
type Thread struct {
	// 记录本线程当前pc寄存器的值。同样的值在当前方法的栈帧中也有一份，
	//当方法返回时，将当前栈帧弹出，并且将此pc寄存器的值设置为上一个栈帧中nextPC的值
	pc    int
	// 此线程的栈区
	stack *Stack
}

func NewThread() *Thread {
	return &Thread{stack: newStack(1024)}// 这里指定的是虚拟机栈中，栈帧的最大数量。这里先随便给个1024
}

// 返回PC寄存器的值
func (self *Thread) PC() int {
	return self.pc
}

// 设置PC寄存器
func (self *Thread) SetPC(pc int) {
	self.pc = pc
}

// push一个栈帧
func (self *Thread) PushFrame(frame *Frame) {
	self.stack.push(frame)
}

// 弹出一个栈帧
func (self *Thread) PopFrame() *Frame {
	return self.stack.pop()
}

// 返回当前栈帧
func (self *Thread) CurrentFrame() *Frame {
	return self.stack.top()
}

func (self *Thread) NewFrame(method *heap.Method) *Frame {// 此方法的最大本地变量数量和操作数栈最大深度
	return newFrame(self, method)
}

// 判断此线程的栈是否为空
func (self *Thread) IsStackEmpty() bool {
	return self.stack.isEmpty()
}
